/*
 * 文件功能说明：
 * 该文件实现了机器人小车的寻迹功能。通过左右两个红外传感器检测地面上的黑线，并控制电机的转动方向，使小车沿着黑线行驶。
 * - 通过GPIO控制电机的正转、反转、停止等状态。
 * - 利用定时器周期性地读取红外传感器的值，根据传感器的输入调整小车行驶方向。
 * - 左右轮电机由L9110S驱动，通过GPIO0、GPIO1控制左轮，通过GPIO9、GPIO10控制右轮。
 * - 红外传感器通过GPIO11和GPIO12与3861芯片连接，分别用于检测左侧和右侧的黑线。
 */

 #include "ohos_init.h"
 #include "cmsis_os2.h"
 #include "iot_gpio.h"
 #include "hi_io.h"
 #include "hi_time.h"
 #include "iot_watchdog.h"
 #include "robot_control.h"
 #include "iot_errno.h"
 #include "hi_pwm.h"
 #include "hi_timer.h"
 #include "iot_pwm.h"
 
 #define GPIO0 0   // 左轮控制：GPIO0
 #define GPIO1 1   // 左轮控制：GPIO1
 #define GPIO9 9   // 右轮控制：GPIO9
 #define GPIO10 10 // 右轮控制：GPIO10
 
 #define GPIO11 11 // 左侧红外传感器：GPIO11
 #define GPIO12 12 // 右侧红外传感器：GPIO12
 
 #define GPIO_FUNC 0 // GPIO功能模式设置
 #define car_speed_left 0 // 默认左轮停止
 #define car_speed_right 0 // 默认右轮停止
 #define DISTANCE_STOP 20
 extern unsigned char g_car_status; // 小车状态
 extern uint8_t  SR04_flag = 0;
 extern float SR04_distance = 0;
 extern unsigned int get_current_speed_delay(void); // 获取当前速度延时
 unsigned int g_car_speed_left = car_speed_left;
 unsigned int g_car_speed_right = car_speed_right;

 IotGpioValue io_status_left;
 IotGpioValue io_status_right;
 
 /*
  * 函数：timer1_callback
  * 功能：定时器回调函数，用于读取红外传感器的输入值，并根据传感器状态调整电机速度。
  *      根据传感器的检测情况，决定小车的转向或前进状态。
  * 输入：
  *      arg - 回调函数的参数（此处未使用）
  * 输出：无
  */
 void timer1_callback(unsigned int arg)
 {
     IotGpioValue io_status;
 
     IoTGpioGetInputVal(GPIO11, &io_status_left); // 获取左侧传感器输入
     IoTGpioGetInputVal(GPIO12, &io_status_right); // 获取右侧传感器输入

    //没扫到黑线，起步直行
     if(io_status_right == IOT_GPIO_VALUE1 && io_status_left == IOT_GPIO_VALUE1 && SR04_flag == 0) //全低
     {   
         // 小车直行
         car_forward();
     }
     //扫到黑线是高电平
     // 小车往左偏，需要右转修正
     if(io_status_right == IOT_GPIO_VALUE0 && io_status_left != IOT_GPIO_VALUE0 && SR04_flag == 0 ) //左高右低
     {   
         // 小车右转
         car_right();
     }
 
     // 小车往右偏，需要左转修正
     if(io_status_right != IOT_GPIO_VALUE0 && io_status_left == IOT_GPIO_VALUE0 && SR04_flag == 0 ) //右高左低
     {
         // 小车左转
         car_left();
     }
     //扫到两黑线，停止
     if(io_status_right == IOT_GPIO_VALUE0 && io_status_left == IOT_GPIO_VALUE0 || SR04_flag == 1) //全高
     {
         // 小车停止
         car_stop();
     }
    


 }

 /*
  * 函数：trace_module
  * 功能：启动定时器，并通过红外传感器反馈来调整小车的前进方向。根据传感器状态控制电机转动。
  * 输入：无
  * 输出：无
  */
 void trace_module(void)
 {
     unsigned int timer_id1;
     hi_timer_create(&timer_id1);
 
     // 启动系统周期定时器，每1ms触发timer1_callback任务
     hi_timer_start(timer_id1, HI_TIMER_TYPE_PERIOD, 1, timer1_callback, 0);



    
    //   gpio_control(GPIO0, IOT_GPIO_VALUE1);  // 启动左轮电机
    //   gpio_control(GPIO1, g_car_speed_left); // 控制左轮速度
    //   gpio_control(GPIO9, IOT_GPIO_VALUE1);  // 启动右轮电机
    //   gpio_control(GPIO10, g_car_speed_right); // 控制右轮速度

     while (1) 
     { 
        //  gpio_control(GPIO1, g_car_speed_left);  // 持续控制左轮速度
        //  gpio_control(GPIO10, g_car_speed_right); // 持续控制右轮速度
        SR04_distance = GetDistance();

        // printf("SR04_distance : %.2f\r\n",SR04_distance);

 
          if (g_car_status != CAR_TRACE_STATUS)  // 如果状态不是寻迹模式，退出循环
          {
              break;
          }

          // 使用速度控制延时
          unsigned int speed_delay = get_current_speed_delay();
          if (speed_delay > 0) {
              hi_sleep(speed_delay);
          } else {
              hi_sleep(20);  // 默认延时
          }
     }
     hi_timer_delete(timer_id1); // 删除定时器
 }
 